/* Araujo Heiker CI. 19726991
 * Goyo Willandher CI.20666542
 * Rodriguez Rafael CI.20009872
 * Williams Roman CI.20016812 
 * Morett Gilberth CI.20929667*/

package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.Date;
import java.util.Vector;

import modelo.Deposito;
import modelo.Drogueria;
import modelo.Estante;
import modelo.FacturaCompra;
import modelo.ItemCompra;
import modelo.LoteProducto;
import modelo.Paleta;
import modelo.Producto;
import modelo.SubItemCompra;
import vista.ventanaSubItemCompra;

public class ControladorVentanaSubItemCompra implements ActionListener,
		FocusListener {
	private ventanaSubItemCompra ventanaSubItemCompra;
	private Drogueria drogueria;

	public ControladorVentanaSubItemCompra(Drogueria drogueria) {
		this.drogueria = drogueria;
		ventanaSubItemCompra = new ventanaSubItemCompra();
		ventanaSubItemCompra.setLocationRelativeTo(null);
		ventanaSubItemCompra.setVisible(true);
		ventanaSubItemCompra.agregarListener(this);
		this.llenarComboItemCompra();
		this.llenarComboDeposito();
		ventanaSubItemCompra.ponerEneableCajaTexto();

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equalsIgnoreCase("ItemCompras")) {
			cargarCantidadDesdeCboDeposito();
		} else if (e.getActionCommand().equalsIgnoreCase("Depositos")) {
			ventanaSubItemCompra.LimpiarComboEstanteOPaleta();
			llenarCboEstantes();
		} else if (e.getActionCommand().equalsIgnoreCase("Aceptar")) {
			agregarInformacionTabla();
		} else if (e.getActionCommand().equalsIgnoreCase("Cancelar")) {
			eliminarItemTblUbicarProducto();
		} else if (e.getActionCommand()
				.equalsIgnoreCase("GuardarSubItemCompra")) {
			boolean valor = guardarUbicarItemCompra();
			if (valor == true) {
				clickGuardar();
			}
		}
	}

	private boolean guardarUbicarItemCompra() {
		if (ventanaSubItemCompra.CantidadfilasUbicarItemCompras() >= 0) {
			if (validarGuardar() == 1) {
				FacturaCompra facturacompra;
				facturacompra = drogueria.getUnaFacturaCompra(drogueria
						.cantidadFacturaCompra() - 1);
				for (int i = 0; i < facturacompra.cantidadtemCompra(); i++) {
					ItemCompra itemcompra;
					itemcompra = facturacompra.getItemCompra(i);
					Date fechaVencimiento = itemcompra.getFechaVencimiento();
					Producto producto = itemcompra.getProducto();
					String codigoProducto = producto.getCodigoProducto();

					for (int j = 0; j < ventanaSubItemCompra
							.CantidadfilasUbicarItemCompras(); j++) {
						String infProducto = (String) ventanaSubItemCompra
								.getTblubicaritemcompra().getValueAt(j, 0);
						String codigoProducto1 = infProducto.substring(0, 4);
						if (codigoProducto1.equals(codigoProducto)) {
							Vector<String> datos = new Vector<String>(4, 1);
							datos = ventanaSubItemCompra
									.retornarUbicarItemCompra(j);
							String infdeposito = datos.elementAt(1);
							String deposito = infdeposito.substring(0, 4);
							String infestanteOPaleta = datos.elementAt(2);
							String palet = infestanteOPaleta.substring(0, 5);
							String cantidad = datos.elementAt(3);
							int cantidadEntera = Integer.parseInt(cantidad);
							SubItemCompra subItemCompra = new SubItemCompra(
									cantidadEntera, deposito, palet,
									fechaVencimiento);
							itemcompra.IncluirUbicarItemCompra(subItemCompra);
							
							
							
							
							
							
							Deposito depo = new Deposito();
							System.out.println("Codigo de deposito");
							System.out.println(deposito);
							int ubicacionDeposito = drogueria.buscarDeposito(deposito);
							depo = drogueria.getUnDeposito(ubicacionDeposito);
							LoteProducto lote = new LoteProducto();
							Paleta paleta = new Paleta();
							int k = depo.buscarPaleta(palet);
							System.out.println("Codigo de paleta que se trae");
							System.out.println(palet);
							if (k != -1) {
								paleta = depo.getUnaPaleta(k);
								lote.setCantidad(cantidadEntera);
								lote.setProducto(producto);
								lote.setFechaVencimiento(fechaVencimiento);
								paleta.incluirLoteProducto(lote);

							} else {
								Estante estante = new Estante();
								int g = depo.buscarEstante(palet);
								estante = depo.getUnEstante(g);
								lote.setCantidad(cantidadEntera);
								lote.setProducto(producto);
								lote.setFechaVencimiento(fechaVencimiento);
								estante.incluirLoteProducto(lote);

							}
						}
					}
				}

				ventanaSubItemCompra
						.mostrarMensaje("Los productos se han ubicados en los depositos con exito");
			} else {
				ventanaSubItemCompra
						.mostrarMensaje("Debe Ubicar todos los productos.");
				return false;
			}
		} else {
			ventanaSubItemCompra
					.mostrarMensaje("Debe agregar los productos que seran ubicados");
			return false;
		}
		return true;
	}

	public void llenarComboDeposito() {
		for (int i = 0; i < drogueria.cantidadDepositos(); i++) {
			Deposito deposito = new Deposito();
			deposito = drogueria.getUnDeposito(i);

			if (deposito.getStatus() == 'E') {
				continue;
			}
			String item = deposito.getCodigo() + " " + deposito.getNombre();

			ventanaSubItemCompra.agregarItemDeposito(item);
		}
	}

	public void llenarCboEstantes() {
		String intem = (String) ventanaSubItemCompra.getCboDepositos()
				.getSelectedItem();
		if (ventanaSubItemCompra.getCboDepositos().getSelectedItem() == "Depositos.") {
			ventanaSubItemCompra.mostrarMensaje("Debe elegir un Deposito");
			return;
		}
		String codigo = intem.substring(0, 4);
		int index = drogueria.buscarDeposito(codigo);
		Deposito deposito = drogueria.getUnDeposito(index);
		for (int i = 0; i < deposito.cantEstantes(); i++) {
			Estante estante;
			estante = deposito.getUnEstante(i);
			String codigoEstante = estante.getNroEstante() + " "
					+ estante.getDescripcion();
			ventanaSubItemCompra.agregarItemEstantoOPaleta(codigoEstante);

		}
		for (int i = 0; i < deposito.cantPaletas(); i++) {
			Paleta paleta = new Paleta();
			paleta = deposito.getUnaPaleta(i);
			String codigoPaleta = paleta.getNroPaleta() + " "
					+ paleta.getDescripcion();
			ventanaSubItemCompra.agregarItemEstantoOPaleta(codigoPaleta);
		}
	}

	public void llenarCampoDeAsignacion() {
		int cantidadasignada = Integer.parseInt(ventanaSubItemCompra
				.getTxtcantidadasignada());
		int cantidadquedebeAsignar = Integer.parseInt(ventanaSubItemCompra
				.getTxtcantidadquedebeasignar());
		String cantidadquedebeasignar = String.valueOf(cantidadquedebeAsignar
				- cantidadasignada);
		ventanaSubItemCompra
				.setTxtcantidadquedebeasignar(cantidadquedebeasignar);

	}

	public void agregarInformacionTabla() {
		if (ventanaSubItemCompra.getSelectedItemCboEstante() == null) {
			ventanaSubItemCompra.mostrarMensaje("Debe Seleccionar un Estante");
			return;
		} else if (ventanaSubItemCompra.getTxtcantidadasignada().equals("")) {
			ventanaSubItemCompra.mostrarMensaje("Debe asignar una cantidad");
			return;
		}
		String cantidadString = ventanaSubItemCompra
				.getTxtcantidadquedebeasignar();
		if (cantidadString.equals("0")) {
			ventanaSubItemCompra.mostrarMensaje("Ya a sido Asignado");
			return;
		}
		int cantidad1 = Integer.parseInt(ventanaSubItemCompra
				.getTxtcantidadasignada());
		int cantidad2 = Integer.parseInt(cantidadString);
		if (cantidad1 > cantidad2) {
			ventanaSubItemCompra
					.mostrarMensaje("Error debe seleccionar una cantidad menor!!");
			ventanaSubItemCompra.setTxtcantidadasignada("");
			return;
		} else {
			int cantidad3 = cantidad2 - cantidad1;
			ventanaSubItemCompra.setTxtcantidadquedebeasignar(String
					.valueOf(cantidad3));

			ventanaSubItemCompra.setTxtcantidadasignada("");
		}

		String infproducto = ventanaSubItemCompra.getSelectedItemCboProductos();
		String infdeposito = ventanaSubItemCompra.getSelectedItemCboDepositos();
		String infestante = ventanaSubItemCompra.getSelectedItemCboEstante();
		Vector<String> datos = new Vector<String>(4, 1);
		for (int i = 0; i < ventanaSubItemCompra
				.CantidadfilasUbicarItemCompras(); i++) {
			String infProductoTabla = (String) ventanaSubItemCompra
					.getTblubicaritemcompra().getModel().getValueAt(i, 0);
			String infDepositoTabla = (String) ventanaSubItemCompra
					.getTblubicaritemcompra().getModel().getValueAt(i, 1);
			String infEstanteTabla = (String) ventanaSubItemCompra
					.getTblubicaritemcompra().getModel().getValueAt(i, 2);
			String cantidadTbl = (String) ventanaSubItemCompra
					.getTblubicaritemcompra().getModel().getValueAt(i, 3);
			int cantidadTblEntera = Integer.parseInt(cantidadTbl);
			if (infProductoTabla.equals(infproducto)
					&& infDepositoTabla.equals(infdeposito)
					&& infEstanteTabla.equals(infestante)) {
				int nuevaCantidadPorCodigo = cantidadTblEntera + cantidad1;
				String nuevaCantidadPorCodigoString = String
						.valueOf(nuevaCantidadPorCodigo);
				ventanaSubItemCompra.agregarItemUbicarItemCompraString(
						nuevaCantidadPorCodigoString, i);
				return;
			}

			else {
				continue;
			}
		}
		datos.add(infproducto);
		datos.add(infdeposito);
		datos.add(infestante);
		datos.add(String.valueOf(cantidad1));
		ventanaSubItemCompra.agregarItemUbicarItemCompra(datos);
		ventanaSubItemCompra.LimpiarComboEstanteOPaleta();
	}

	public void eliminarItemTblUbicarProducto() {

		if (ventanaSubItemCompra.retornarFilaSelecionada() >= 0) {
			String cantidadtbla = ventanaSubItemCompra
					.retornarCantidadDeTabla(ventanaSubItemCompra
							.retornarFilaSelecionada());
			String infProducto = ventanaSubItemCompra
					.retornarProductoDeTabla(ventanaSubItemCompra
							.retornarFilaSelecionada());
			String codigoProducto = infProducto.substring(0, 4);
			FacturaCompra facturacompra = new FacturaCompra();
			facturacompra = drogueria.getUnaFacturaCompra(drogueria
					.cantidadFacturaCompra() - 1);
			int index = facturacompra.buscarItemCompra(codigoProducto);
			ventanaSubItemCompra.setCboItemCompra(index);
			String cantidadquedebeasignar = ventanaSubItemCompra
					.getTxtcantidadquedebeasignar();

			int cantidadtblaentera = Integer.parseInt(cantidadtbla);
			int cantidadquedebeasignarentera = Integer
					.parseInt(cantidadquedebeasignar);
			int nuevaCantidad = cantidadtblaentera
					+ cantidadquedebeasignarentera;
			String nuevacantidadalfanumerica = String.valueOf(nuevaCantidad);
			ventanaSubItemCompra
					.setTxtcantidadquedebeasignar(nuevacantidadalfanumerica);

			ventanaSubItemCompra
					.eliminarFilaTblUbicarItemCompra(ventanaSubItemCompra
							.retornarFilaSelecionada());
		} else {
			ventanaSubItemCompra
					.mostrarMensaje("Debe seleccionar un Item de la tabla");
			return;
		}

	}

	public void llenarComboItemCompra() {
		FacturaCompra facturacompra = new FacturaCompra();
		int index = drogueria.cantidadFacturaCompra();
		facturacompra = drogueria.getUnaFacturaCompra(index - 1);
		for (int i = 0; i < facturacompra.cantidadtemCompra(); i++) {
			ItemCompra itemcompra = new ItemCompra();
			itemcompra = facturacompra.getItemCompra(i);
			String codigo = itemcompra.getProducto().getCodigoProducto();
			String nombre = itemcompra.getProducto().getNombre();
			String item = codigo + " " + nombre;
			ventanaSubItemCompra.agregarItemCompras(item);

		}
	}

	public void cargarCantidadDesdeCboDeposito() {
		String item = (String) ventanaSubItemCompra.getCboItemCompras()
				.getSelectedItem();
		String codigop = item.substring(0, 4);
		FacturaCompra factura;
		factura = drogueria.getUnaFacturaCompra(drogueria
				.cantidadFacturaCompra() - 1);
		int index = factura.buscarItemCompra(codigop);
		ItemCompra itemcompra;
		itemcompra = factura.getItemCompra(index);
		int cantidad = itemcompra.getCantidad();
		int cantFila = ventanaSubItemCompra.CantidadfilasUbicarItemCompras();
		if (cantFila == 0) {
			String cantTot = String.valueOf(cantidad);
			ventanaSubItemCompra.setTxtcantidadquedebeasignar(cantTot);
			return;

		} else {
			for (int j = 0; j < cantFila; j++) {
				String infProducto = (String) ventanaSubItemCompra
						.getTblubicaritemcompra().getValueAt(j, 0);
				String codProducto = infProducto.substring(0, 4);
				if (codProducto != codigop) {
					String cantTo = String.valueOf(cantidad);
					ventanaSubItemCompra.setTxtcantidadquedebeasignar(cantTo);
				}

			}
		}
		int cantidadReal = 0;
		for (int i = 0; i < cantFila; i++) {
			String infProducto = (String) ventanaSubItemCompra
					.getTblubicaritemcompra().getValueAt(i, 0);
			String codProducto = infProducto.substring(0, 4);
			if (codProducto.equals(codigop)) {
				String cant = (String) ventanaSubItemCompra
						.getTblubicaritemcompra().getValueAt(i, 3);
				int cantidadPedida = Integer.parseInt(cant);
				cantidadReal = cantidadReal + cantidadPedida;
				String canTotal = String.valueOf(cantidad - cantidadReal);
				ventanaSubItemCompra.setTxtcantidadquedebeasignar(canTotal);

			}

		}
		ventanaSubItemCompra.ponerEneableCajaTexto();
		ventanaSubItemCompra.agregarFocusListener(this);
	}

	public int validarGuardar() {
		int cantidadTotal = 0;
		int acumCantidadProductosItemCompra = 0;
		for (int i = 0; i < ventanaSubItemCompra
				.CantidadfilasUbicarItemCompras(); i++) {
			String cantidadParcial = (String) ventanaSubItemCompra
					.getTblubicaritemcompra().getValueAt(i, 3);
			int cantidadParcialEntera = Integer.parseInt(cantidadParcial);
			cantidadTotal = cantidadTotal + cantidadParcialEntera;
		}
		FacturaCompra facturacompra = drogueria.getUnaFacturaCompra(drogueria
				.cantidadFacturaCompra() - 1);
		for (int j = 0; j < facturacompra.cantidadtemCompra(); j++) {
			ItemCompra itemcompra;
			itemcompra = facturacompra.getItemCompra(j);
			int cantidadProductosItemCompra = itemcompra.getCantidad();
			acumCantidadProductosItemCompra = acumCantidadProductosItemCompra
					+ cantidadProductosItemCompra;
		}
		if (cantidadTotal == acumCantidadProductosItemCompra) {
			return 1;
		} else
			return 2;
	}

	public void clickGuardar() {

		try {

			ventanaSubItemCompra.dispose();
			this.finalize();
		} catch (Throwable e1) {
			e1.printStackTrace();
		} finally {
			new ControladorVentanaFacturaPrincipal(drogueria);

		}
	}

	@Override
	public void focusGained(FocusEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void focusLost(FocusEvent e) {
		// TODO Auto-generated method stub

	}

}
